package com.soft.bams.dao;

import java.util.Calendar;

//<T> 代表容器中的元素的类型，例如Account，Admin等
//<K>代表容器的类型，例如Account[],list<Account>
public interface IDao<T,K> {
    //插入新用户
    //插入元素
    public void insert(T t);
    //根据ID和密码查询
    public T selectOne(Long id,String password);
    //根据ID查询
    public T selectOne(Long id);
    //查询所有银行账户
    public K selectAll();
    //获取ID
    public Long getId();
    //设置ID
    public void setId(Long id);
    //新增createID(),默认方法default，有利于升级改造
    public default Long createID(){
        // 1. 从 DAO 当前保存的“下次可用 ID”中读出字符串形式
        String idstr = getId().toString();
        // 2. 从这串数字里提取“年份”（第 9–12 位）和“月份”（第 13–14 位）
        int year  = Integer.parseInt(idstr.substring(8,12));
        int month = Integer.parseInt(idstr.substring(12,14));
        // 3. 后四位当做本月的流水号
        String count = idstr.substring(14);
        // 4. 获取当前系统时间的“今年”和“本月”
        Calendar cal    = Calendar.getInstance();
        int nowYear     = cal.get(Calendar.YEAR);
        int nowMonth    = cal.get(Calendar.MONTH) + 1;  // Calendar.MONTH 从 0 开始
        // 5. 如果跨月或跨年，就重置流水号为“0001”
        if (nowYear != year && nowMonth != month) {
            year  = nowYear;
            month = nowMonth;
            count = "0001";
        }
        // 6. 如果当月流水已经到“9999”，重置并提示已满，返回 -1
        if (count.equals("9999")) {
            System.out.println("本月开卡名额已满，请下个月再来！");
            return -1L;
        }
        // 7. 根据当前 year、month、count 拼接完整 ID 字符串
        //    前缀固定 “86215021”，再加年(4)/月(1-2)/流水(4)
        String str;
        if (month < 10) {
            // 月份个位数时补 0
            str = "86215021" + year + "0" + month + count;
        } else {
            str = "86215021" + year + month + count;
        }
        // 8. 字符串转 Long，得到新分配给用户的 ID
        Long newId = Long.valueOf(str);
        // 9. 把“下次要用的起始 ID”更新为 newId+1，并持久化（调用 setId）
        this.setId(newId + 1);
        // 10. 返回本次生成的 ID
        return newId;
    }
    /**
     * 新增更新账户的方法update()  default默认方法，有利于接口升级改造
     *  （基于内存操作ArrayDao、ListDao不需要更新操作；基于文件操作FileDao、基于数据库操作JDBCDao需要更新操作）
     */
    public default boolean update(T t){
        return false;
    }


}
